/**
* @author zqp
* @version2017年12月24日 
* @description 
*/
package com.zqp.security.core.social.qq.connet;

import java.nio.charset.Charset;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.social.oauth2.AccessGrant;
import org.springframework.social.oauth2.OAuth2Template;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

/**
 * @author zqp
 * @version2017年12月24日
 * @description
 */
public class QQAuth2RestTemplate extends OAuth2Template {

	private   Logger logger = LoggerFactory.getLogger(getClass());
	/**

	 * 5.5.8 构造方法

	 * 5.5.11 查看请求是怎么拼装的OAuth2Template 134

	 * 5.5.12 请求时带上client_id clientSecret

	 */
	public QQAuth2RestTemplate(String clientId, String clientSecret, String authorizeUrl, String accessTokenUrl) {
		super(clientId, clientSecret, authorizeUrl, accessTokenUrl);
			setUseParametersForClientAuthentication(true);
	}
	/**
	 * 解决qq返回的token信息 a&b&c 和springSocial json格式不匹配的问题
	 */
	@Override
	protected AccessGrant postForAccessGrant(String accessTokenUrl, MultiValueMap<String, String> parameters) {
		String response = getRestTemplate().postForObject(accessTokenUrl, parameters, String.class);
		logger.info("获取accesstoken 的响应:"+  response);
		
		String[] items  = StringUtils.splitByWholeSeparatorPreserveAllTokens(response, "&");
		
		String accessToken = StringUtils.substringAfterLast(items[0], "=");
		Long expireIn =new  Long(StringUtils.substringAfterLast(items[1], "="));
		String resfreshToken = StringUtils.substringAfterLast(items[2], "=");
		return new AccessGrant(accessToken, null, resfreshToken, expireIn);
		
	}
	
	/**
	 * 9 覆盖父类方法，构造自定义restTemplate
	 */
	@Override
	protected RestTemplate createRestTemplate() {

		RestTemplate restTemplate = super.createRestTemplate();

		restTemplate.getMessageConverters().add(new StringHttpMessageConverter(Charset.forName("UTF-8")));
		return restTemplate;
	}
}
